package service;

import domain.Architect;
import domain.Designer;
import domain.Employee;
import domain.Programmer;

/**
 * Classname: TeamService
 * Package: service
 * Description:
 * 关于开发团队的管理：添加、删除等操作
 * @Author Alex Liang
 * @Create 2023/12/19 11:33
 * @Version 1.0
 */

public class TeamService {
    private static int counter = 1;//给memberID进行自动赋值
    private final int MAX_MEMBER = 5;//表示开发团队最大成员数
    private Programmer[] team = new Programmer[MAX_MEMBER];//开发团队的数组
    private int total = 0;//记录开发团队中的人数

    /**
     * 返回当前团队的所有对象
     * @return 包含所有成员对象的数组，数组大小与成员人数一致
     */
    public Programmer[] getTeam(){
        Programmer[] team = new Programmer[total];
        for (int i = 0; i < total; i++) {
            team[i] = this.team[i];
        }
        return team;
    }
    /**
     * 向团队中添加成员
     * @param e 待添加成员的对象
     * @throws TeamException 添加失败，TeamException中包含了失败原因
     */
    public void addMember(Employee e) throws TeamException{

//        * 成员已满，无法添加
        if (total >= MAX_MEMBER)
            throw new TeamException("成员已满，无法添加");
//        * 该成员不是开发成员，无法添加
        if (!(e instanceof Programmer))
            throw new TeamException("该成员不是开发成员，无法添加");
        Programmer p = (Programmer) e;
        Status status = p.getStatus();
//        * 该员工已是某团队成员
//        * 该员工正在休假，无法添加
        switch (status){
            case BUSY:
                throw new TeamException("该员工已是某团队成员");
            case VACATION:
                throw new TeamException("该员工正在休假，无法添加");
        }

//        * 该员工已在本开发团队中
        boolean isExist = isExist(p);
        if (isExist)
            throw new TeamException("该员工已在本开发团队中");
//        * 团队中至多只能有一名架构师
//        * 团队中至多有只能有两名设计师
//        * 团队中至多只能有三名程序员
        int arcNum = 0, desNum = 0, proNum = 0;
        for (int i = 0; i < total; i++) {
            if (team[i] instanceof Architect)
                arcNum++;
            else if (team[i] instanceof Designer)
                desNum++;
            else
                proNum++;
        }


        if (p instanceof Architect) {
            if (arcNum >= 1) {
                throw new TeamException("团队中至多只能有一名架构师");
            }
        }
        else if (p instanceof Designer) {
            if (desNum >= 2) {
                throw new TeamException("团队中至多有只能有两名设计师");
            }
        }
        else {
            if (proNum >= 3) {
                throw new TeamException("团队中至多只能有三名程序员");
            }
        }
        //代码如果执行到此处，说明p是可以被添加到team数组中
        team[total++] = p;
        p.setMemberid(counter++);
        p.setStatus(Status.BUSY);

    }

    /**
     * 判断p是否存在于当前的开发团队中
     * @param p
     * @return
     */
    private boolean isExist(Programmer p) {
        for (int i = 0; i < total; i++) {
            if (team[i].getId() == p.getId())
                return true;
        }
        return false;
    }

    /**
     * 从团队中删除成员
     * @param memberID 待删除成员的ID
     * @throws TeamException 找不到指定memberID的员工，TeamException删除失败
     */
    public void removeMember(int memberID) throws TeamException{
        int i = 0;
        for ( ; i < total; i++) {
            if (team[i].getMemberid() == memberID){
                //找到此员工，调整其相关属性Status
                team[i].setStatus(Status.FREE);

                break;
            }

        }
        //没找到该员工
        if (i == total)
            throw new TeamException("找不到指定memberID的员工，删除失败");

        //调整数组顺序
        for (int j = i; j < total - 1; j++){
            team[j] = team[j + 1];
        }
//        team[total - 1] = null;
//        total--;
        team[--total] = null;

    }

}
